// Created by mac on 2020/10/7.
//


#include "Tree_.h"
#include "Queue.h"

#ifndef TEST_PRIME_H
#define TEST_PRIME_H
#endif //TEST_PRIME_H

/**
 * 试卷中的练习题
 * */
//1
int Prime() {
    /*判断输入的数字是否为素数*/
    //是 返回1
    //不是返回0
    int num, i;
    printf("请输入一个用以判断是否为素数的数字:\n");
    scanf("%d", &num);
    if (num == 1) {
        return 0;       //数学规定1 不是素数
    }
    for (i = 2; i < num; i++) {//在本身和1 之间又一个能被整除的 则不是素数
        if (num % i == 0) {
            printf("%d不是素数。\n", num);
            return 0;   //不是素数
        }
    }
    printf("%d是素数。\n", num);
    return 1;           //是素数
}

//2
/**
 * 1-2+3-4+5-...-100
 * */
int OneToHundred_AddAndMinus() {
    int i, sum = 0;
    for (i = 1; i <= 100; i++) {       //生成 1 到100 的数字
        if (i % 2 == 0) sum = sum - i;// 减偶数
        else sum = sum + i;           // 加奇数
    }
    printf("1-2+3-4+5-...-100 = %d\n", sum);
    return sum;
}

/**
 * 1/2+3/4+4/5+...+99/100
 * */
int OneToHundred_division() {
    double sum = 0.0;             //保存结果
    double i;                  //当前值
    for (i = 1; i < 100; i++) {    //i取值范围 为 1-99
//        printf("%f\n",i);
        sum = sum + i / (i + 1);
//        printf("%f,%f,%f,%f\n",i,i+1,i/(i+1),sum);
    }
    printf("1/2+3/4+4/5+...+99/100 = %f\n", sum);
    return sum;
}

/**
 * 数据结构 模拟三
 * 递归计算 二叉链数叶子结点的个数
 * */

//递归计算二叉链数叶子结点的个数
int CountLeaf(BinTree tr, int count) {
    if (tr != NULL) {
//        if (tr->lchild == NULL && tr->rchild == NULL) {
//            count++;
//        }
        count++;
        int r = CountLeaf(tr->rchild, count);
        int l = CountLeaf(tr->rchild, count);
        return r + l;

    }
//    return count;
}

/*课本答案*/
int CountLeaf1(BinTree tr) {
    if (tr->lchild == NULL && tr->rchild == NULL)return 1;
    else return CountLeaf1(tr->rchild) + CountLeaf1(tr->lchild);
}

/**
 * 统计二叉树中节点个数
 * */
int CountTreeNode(BinTree tr, int count) {
    if (tr != NULL) {
        count++;
        count = CountTreeNode(tr->lchild, count);
        count = CountTreeNode(tr->rchild, count);
    }
    return count;
}

/*课本答案*/
int CountTreeNode1(BinTree tr, int count) {
    if (tr == NULL)return 0;
    else return CountTreeNode1(tr->rchild, count) + CountTreeNode1(tr->lchild, count) + 1;
}

/**
 * 先序打印二叉树中的叶子节点 （课本答案）
 * */
void preorder_leaf(BinTree tr) {
    if (tr != NULL) {
        if (tr->rchild == NULL && tr->lchild == NULL)
            printf("%d", tr->data.num);
        preorder_leaf(tr->lchild);
        preorder_leaf(tr->rchild);
    }
}

/**
 * 孩子兄弟链树的层次遍历算法
 * */
//void tree_level(Tree root){
//    SeqQueue sq;
//    sq = InitSeQueue(sq);
//    if (root!=NULL){
//        sq = EnSeQueue(sq,root->data) ;
//        while (!EmptySeQueue(sq)){
//            DataType p=GetSeHead(sq);
//            sq = OutSeQueue(sq);
//            printf("%d\n",p.num);
//            p=p->son;
//            while (p!=NULL){
//                EnSeQueue(SQ,p);
//                p=p->brother;
//            }
//
//        }
//    }
//}
/**
 * 统计单链表中元素为D的个数
 * */
int CountLinkListSameNode(LinkList LKList, DataType D) {
    Node *head;
    int count = 0;
    head = LKList->next;
    while (head != NULL) {
        if (head->data.num == D.num) {
            count++;
        }
        head = head->next;
    }
    printf("%d\n", count);
    return count;
}

/**
 * 判断一个二叉树是不是完全二叉树
 * int binTreeIsTotle(BinTreee btr)
 *
 * */
int binTreeIsTotle(BinTree btr) {
    if (btr->rchild != NULL && btr->lchild != NULL) {       //右左不为空  不是叶子节点继续
        //每一层都是若右存在 则 左不能为空
        if (btr->rchild != NULL) {                     //右存在
            if (btr->lchild == NULL) {                   //左为空 x
                return 1;
            } else {                                      //左不为空继续判断
                binTreeIsTotle(btr->lchild);
            }
        } else {                                      //右不存在 判断左
            binTreeIsTotle(btr->lchild);
        }
    }

}